<html>
<head><meta charset="utf-8"><title>scoped tasks · wg-async-foundations · Zulip Chat Archive</title></head>
<h2>Stream: <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/index.html">wg-async-foundations</a></h2>
<h3>Topic: <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html">scoped tasks</a></h3>

<hr>

<base href="https://rust-lang.zulipchat.com">

<head><link href="https://rust-lang.github.io/zulip_archive/style.css" rel="stylesheet"></head>

<a name="235734367"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235734367" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235734367">(Apr 22 2021 at 19:28)</a>:</h4>
<p>Hey <span class="user-mention" data-user-id="218683">@Alice Ryhl</span> -- in the call yesterday, <span class="user-mention" data-user-id="257961">@Simon Farnsworth</span> mentioned that you had convinced him that scoped tasks a la rayon were impossible. I've been pondering it and I'd like to be convinced. =)</p>



<a name="235734412"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235734412" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235734412">(Apr 22 2021 at 19:28)</a>:</h4>
<p>I have some thoughts on why that might be.</p>



<a name="235734622"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235734622" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Alice Ryhl <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235734622">(Apr 22 2021 at 19:29)</a>:</h4>
<p>The short story is that, unless you block the thread for the full duration of the spawned scoped task, cancellation of the task could break references that the scoped tasks has to the original task.</p>



<a name="235734653"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235734653" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235734653">(Apr 22 2021 at 19:29)</a>:</h4>
<p>Right. I figured it had to do with cancelltion.</p>



<a name="235734825"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235734825" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Alice Ryhl <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235734825">(Apr 22 2021 at 19:30)</a>:</h4>
<p>If you block the thread, then it is possible. (in essence this is what happens if you use rayon inside async code)</p>



<a name="235734854"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235734854" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235734854">(Apr 22 2021 at 19:31)</a>:</h4>
<p>Yes, you certainly have to block the thread.</p>



<a name="235734879"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235734879" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Alice Ryhl <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235734879">(Apr 22 2021 at 19:31)</a>:</h4>
<p>Also, you can spawn scoped async tasks if you do it from synchronous code.</p>



<a name="235735039"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235735039" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Alice Ryhl <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235735039">(Apr 22 2021 at 19:32)</a>:</h4>
<p>Generally one objection many people come up with is that "just wait for it or kill it in the destructor", to which I reply <code>mem::forget</code>, but to that they reply "but <code>Pin</code> has a drop guarantee!", to which the answer unfortunately is that the drop guarantee applies to the wrong thing.</p>



<a name="235735104"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235735104" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235735104">(Apr 22 2021 at 19:33)</a>:</h4>
<p>you definitely cannot rely on destructors to execute</p>



<a name="235735118"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235735118" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Carl Lerche <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235735118">(Apr 22 2021 at 19:33)</a>:</h4>
<p>Yes, it would be possible to add a scope fn to Tokio's Runtime type, but not an async fn scope</p>



<a name="235735348"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235735348" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Alice Ryhl <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235735348">(Apr 22 2021 at 19:34)</a>:</h4>
<p>I mean, the thing with <code>Pin</code> is that it _does_ guarantee that, either destructors run or the memory is leaked.</p>



<a name="235735404"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235735404" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Alice Ryhl <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235735404">(Apr 22 2021 at 19:34)</a>:</h4>
<p>This would be enough for references to remain valid, but the problem is that the guarantee refers to the wrong piece of memory. The memory that stays valid is not the piece of memory that the drop guarantee applies to.</p>



<a name="235735409"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235735409" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Carl Lerche <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235735409">(Apr 22 2021 at 19:34)</a>:</h4>
<p>Yes, but the data has to be owned by the pinned type then</p>



<a name="235735432"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235735432" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Carl Lerche <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235735432">(Apr 22 2021 at 19:35)</a>:</h4>
<p>the pinned type cannot have refs</p>



<a name="235735705"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235735705" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Carl Lerche <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235735705">(Apr 22 2021 at 19:36)</a>:</h4>
<p>So you could make a Scope struct that <em>owns</em> data and <em>that</em> type lets you spawn scoped tasks... the drop fn would have to block</p>



<a name="235735720"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235735720" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Carl Lerche <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235735720">(Apr 22 2021 at 19:36)</a>:</h4>
<p>if that type is pinned...</p>



<a name="235735747"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235735747" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Carl Lerche <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235735747">(Apr 22 2021 at 19:37)</a>:</h4>
<p>but, at that point, why not just move the data to an Arc</p>



<a name="235736586"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235736586" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Simon Farnsworth <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235736586">(Apr 22 2021 at 19:42)</a>:</h4>
<p>Arc's problem (<em>minor</em>) is that it results in you bumping and dropping the refcount a lot, which references don't (being the same thing done at compile time).</p>



<a name="235736811"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235736811" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Carl Lerche <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235736811">(Apr 22 2021 at 19:44)</a>:</h4>
<p>we are also talking about that in context of async, which comes w/ arcs built into the core runtime model</p>



<a name="235736917"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235736917" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Carl Lerche <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235736917">(Apr 22 2021 at 19:45)</a>:</h4>
<p>I mean, it would be nice to have async scoped, but I think the value of the feature is less than it is with sync</p>



<a name="235737169"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235737169" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Alice Ryhl <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235737169">(Apr 22 2021 at 19:47)</a>:</h4>
<p>There's also the fact that, in some sense, the <code>FuturesUnordered</code> utility <em>is</em> a way to do scoped spawns.</p>



<a name="235747229"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235747229" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Simon Farnsworth <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235747229">(Apr 22 2021 at 21:02)</a>:</h4>
<p>It has the sub-executor problem, though, which makes it not as convenient (since you need to avoid starving it and thus the futures inside it</p>



<a name="235748048"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235748048" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Ibraheem Ahmed <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235748048">(Apr 22 2021 at 21:05)</a>:</h4>
<p><span class="user-mention silent" data-user-id="218683">Alice Ryhl</span> <a href="#narrow/stream/187312-wg-async-foundations/topic/scoped.20tasks/near/235734622">said</a>:</p>
<blockquote>
<p>The short story is that, unless you block the thread for the full duration of the spawned scoped task, cancellation of the task could break references that the scoped tasks has to the original task.</p>
</blockquote>
<p>Then what are crates like <code>async-scoped</code> and <code>tokio-scoped</code> doing? Are they unsound?</p>



<a name="235748441"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235748441" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Alice Ryhl <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235748441">(Apr 22 2021 at 21:07)</a>:</h4>
<p><span class="user-mention" data-user-id="363998">@Ibraheem Ahmed</span> No, they just can only be used from non-async code.</p>



<a name="235748667"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235748667" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Simon Farnsworth <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235748667">(Apr 22 2021 at 21:08)</a>:</h4>
<p><a href="https://docs.rs/async-scoped/0.6.1/async_scoped/#safety-considerations">https://docs.rs/async-scoped/0.6.1/async_scoped/#safety-considerations</a> is only Safe Rust when called from non-async code - it has <code>unsafe</code> functions for using it from async context</p>



<a name="235750858"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235750858" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Alice Ryhl <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235750858">(Apr 22 2021 at 21:24)</a>:</h4>
<p>Thinking a bit about it, you could totally do this: <a href="https://play.rust-lang.org/?version=stable&amp;mode=debug&amp;edition=2018&amp;gist=4d1bfb5d2ee420b6689bb0506b9c2b09">https://play.rust-lang.org/?version=stable&amp;mode=debug&amp;edition=2018&amp;gist=4d1bfb5d2ee420b6689bb0506b9c2b09</a></p>



<a name="235751102"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235751102" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Alice Ryhl <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235751102">(Apr 22 2021 at 21:26)</a>:</h4>
<p>It doesn't actually spawn any tasks, but it provides a similar API to rayon.</p>



<a name="235788159"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235788159" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> John-John Tedro <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235788159">(Apr 23 2021 at 05:13)</a>:</h4>
<p>There is one other technique possible to achieve scoped tasks that hasn't been touched on yet. It is one I discovered while working on a singlethreaded executor for async audio related purposes. And I believe that it's currently sound, all though if someone sees something I've missed feel free to point it out!</p>
<p>The idea is that you perform synchronized polling with the worker thread. So a task on the worker thread is only allowed to make progress if the owner of the task where the scope is located is blocked for the duration of a poll.</p>
<p>This is the technique I use in ste: &lt;<a href="https://docs.rs/ste/0.1.0-alpha.9/ste/struct.Thread.html#method.submit_async">https://docs.rs/ste/0.1.0-alpha.9/ste/struct.Thread.html#method.submit_async</a>&gt; (Note: Safety documentation is outdated).</p>
<p>The upside is that it doesn't block the caller particularly more than it would be blocked as if it were to perform the task itself. The downside is that since polling is strictly coordinated with the task on the worker thread it doesn't scale very well over multiple threads. But maybe there's a way this can be extended to achieve this.</p>
<p>It tolerates <code>mem::forget</code>s because if the calling task is not being polled as would be the case if it's forgotten, then neither is the task on the worker thread.</p>
<p>Cheers!</p>



<a name="235792085"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235792085" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Kestrer <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235792085">(Apr 23 2021 at 06:13)</a>:</h4>
<p>Alice's approach is basically the same as the one provided by the <code>safe-async-scoped</code> crate: <a href="https://docs.rs/safe-async-scoped">https://docs.rs/safe-async-scoped</a></p>



<a name="235792549"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235792549" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Kestrer <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235792549">(Apr 23 2021 at 06:20)</a>:</h4>
<p><span class="user-mention" data-user-id="224523">@John-John Tedro</span> Is there even any point to spawning the task at that point though? As far as I understand the purpose of spawning tasks is to allow them to run in the background without polling the handle, but if polling the handle blocks for as polling the future itself what advantage does that provide over simply awaiting the future directly?</p>



<a name="235793003"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235793003" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> John-John Tedro <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235793003">(Apr 23 2021 at 06:27)</a>:</h4>
<p><span class="user-mention silent" data-user-id="360486">Kestrer</span> <a href="#narrow/stream/187312-wg-async-foundations/topic/scoped.20tasks/near/235792549">said</a>:</p>
<blockquote>
<p><span class="user-mention silent" data-user-id="224523">John-John Tedro</span> Is there even any point to spawning the task at that point though? As far as I understand the purpose of spawning tasks is to allow them to run in the background without polling the handle, but if polling the handle blocks for as polling the future itself what advantage does that provide over simply awaiting the future directly?</p>
</blockquote>
<p>The point of STE is to cause the code of the task to run on a different thread. Audio APIs in particular tend to be very picky about which thread certain functions run on. The downside presented here is something I tried to be forthright about in my original message. I'm only mentioning it because it's prior art that hasn't been presented yet!</p>



<a name="235859175"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235859175" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235859175">(Apr 23 2021 at 15:16)</a>:</h4>
<p>thanks for the cites y'all, I wasn't aware of those projects</p>



<a name="235905003"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/187312-wg-async-foundations/topic/scoped%20tasks/near/235905003" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/187312-wg-async-foundations/topic/scoped.20tasks.html#235905003">(Apr 23 2021 at 20:38)</a>:</h4>
<p>I posted some of these links to <a class="stream-topic" data-stream-id="187312" href="/#narrow/stream/187312-wg-async-foundations/topic/interesting.20crates">#wg-async-foundations &gt; interesting crates</a></p>



<hr><p>Last updated: Aug 07 2021 at 22:04 UTC</p>
</html>